package com.xbts.system.domain;

import java.math.BigDecimal;

import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.xbts.common.enums.ShoppingCarEnums;
import com.xbts.system.enums.OrderStatusEnum;
import com.xbts.system.enums.OrderTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Data;

import java.util.Date;
import java.util.List;

import com.xbts.common.annotation.Excel;
import com.xbts.common.utils.StringUtils;
import com.xbts.common.core.domain.BaseEntity;
import org.springframework.format.annotation.DateTimeFormat;

/**
 * 子订单对象 cn_order_item
 *
 * @author xbts
 * @date 2023-08-03
 */
@Data
@ApiModel("子订单对象")
@TableName("cn_order_item")
public class CnOrderItem extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /**
     * 子订单主键
     */
    @TableId
    private String orderItemId;
    /**
     * 订单主键
     */
    @JsonSerialize(using= ToStringSerializer.class)
    private Long orderId;

    /** 用户id */
    @Excel(name = "用户id")
    @ApiModelProperty("用户id")
    @NotEmpty(message = "用户id不能为空")
    @JsonSerialize(using= ToStringSerializer.class)
    private Long userId;

    /** 项目id */
    @Excel(name = "项目id")
    @ApiModelProperty("项目id")
    @NotEmpty(message = "项目id不能为空")
    private String regionId; // 在购物车中支付时赋值的

    /** 创建服务器json 购物车类型为：CLOUD_SERVER时使用该字段 */
    @Excel(name = "创建服务器json 购物车类型为：CLOUD_SERVER时使用该字段")
    @ApiModelProperty("创建服务器json 购物车类型为：CLOUD_SERVER时使用该字段")
    @NotEmpty(message = "创建服务器json 购物车类型为：CLOUD_SERVER时使用该字段不能为空")
    private String jsonStr;

    /** 修改价格 */
    @Excel(name = "修改后价格")
    @ApiModelProperty("修改后价格")
    private BigDecimal updatePrice;

    /** 原始价格 */
    @Excel(name = "原始价格")
    @ApiModelProperty("原始价格")
    @NotEmpty(message = "原始价格不能为空")
    private BigDecimal originalPrice;

    /** 优惠的金额 */
    @Excel(name = "优惠的金额")
    @ApiModelProperty("优惠的金额")
    @NotEmpty(message = "优惠的金额不能为空")
    private BigDecimal discountPrice;
    /** 规格实付款 */
    private BigDecimal ec2Price;
    /** 磁盘实付款 */
    private BigDecimal ebsPrice;
    /** 带宽实付款 */
    private BigDecimal vpcPrice;

    /** 购物车类型(CLOUD_SERVER云服务器 CLOUD_MARKET市场云 GOV_CLOUD政务云) */
    @Excel(name = "购物车类型(CLOUD_SERVER云服务器 CLOUD_MARKET市场云 GOV_CLOUD政务云)")
    @ApiModelProperty("购物车类型(CLOUD_SERVER云服务器 CLOUD_MARKET市场云 GOV_CLOUD政务云)")
    @NotEmpty(message = "购物车类型(CLOUD_SERVER云服务器 CLOUD_MARKET市场云 GOV_CLOUD政务云)不能为空")
    private ShoppingCarEnums shoppingCarEnums;

    /** 订单摘要 */
    @Excel(name = "订单摘要")
    @ApiModelProperty("订单摘要")
    @NotEmpty(message = "订单摘要不能为空")
    private String orderAbstract;

    /** 折扣 */
    @ApiModelProperty("折扣")
    private Integer discount;

    // 政务云、云市场模板id
    private String relationId;

    // 是否自动续费，默认不自动续费
    private Boolean autoRenew;
    // 购买的期限数量
    private Integer periodNum;
    // 购买方式（0按次 1按天 30按月 365按年）
    private Integer periodType;

    /** 开始时间 */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date beginTime;

    /** 结束时间 */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;

    /**
     * 订单类型（USER用户 SYSTEM系统内）
     * @see OrderTypeEnum
     */
    private String shoppingCarType;

    /**
     * 用户与服务器关系表id，当shopping_car_type为SYSTEM时才用
     */
    private Long cnUserCloudServersRelationId;

    /** 开票状态 status=0 待开票，status=1 开票中，status=2 已开票 */
    private String invoicing;

    /** 合同状态 -1已删除 status=0 待开票，status=1 开票中，status=2 已开票 3拒绝*/
    private String contractStatus;

    /**
     * 云市场sku
     */
    private Long marketSkuId;
    /**
     * @See com.xbts.system.enums.OrderStatusEnum
     * 已拒绝的支付状态是“已退款”，其他状态都是已支付
     */
    /** 订单状态（已购买，审核中，审核拒绝） */
    @Excel(name = "订单状态", readConverterExp = "已购买，审核中，审核拒绝")
    @ApiModelProperty("订单状态")
    @NotEmpty(message = "订单状态不能为空")
    private OrderStatusEnum orderStatus;

    /** 订单编号 */
    @Excel(name = "订单编号")
    @ApiModelProperty("订单编号")
    @NotEmpty(message = "订单编号不能为空")
    private String sn;

    @NotEmpty(message = "审核人员")
    private String reviewed_by;

    /**
     * 价格查询对象JSON字符串
     */
    private String priceQueryJsonStr;

    @TableField(exist = false)
    private List<CnDataVolume> dataVolumes;

    /**
     * 支付凭证地址
     */
    @TableField(exist = false)
    private String paymentVoucherAddress;

    public<T> QueryWrapper<T> queryWrapper(){
        QueryWrapper<T> queryWrapper=new QueryWrapper<>();
        queryWrapper.like(StringUtils.isNotEmpty(regionId),"region_id",regionId);
        return queryWrapper;
    }
}